#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include "lcd.h"

/*
    lcd_display_bmp:LCD屏幕上显示bmp图片
    @bmp_path:要显示的bmp图片
    @x0:显示图片的起始x0
    @y0:显示图片的起始y0
    返回值：
        成功 0
        失败 -1
        int
        eg: lcd_display_bmp("1.bmp", 100, 100);
*/
int lcd_display_bmp(char *bmp_path, int x0, int y0)
{
    //1. open打开解析的图片
    int bmp_fd = open(bmp_path, O_RDWR);
    if(bmp_fd == -1)
    {
        printf("open %s fail", bmp_path);
        return -1;
    }

    //2. 获取图片的宽  高   色深
    int width = 0;
    lseek(bmp_fd, 0x12, SEEK_SET);
    read(bmp_fd, &width, 4);

    int height = 0;
    lseek(bmp_fd, 0x16, SEEK_SET);
    read(bmp_fd, &height, 4);

    short depth = 0;
    lseek(bmp_fd, 0x1C, SEEK_SET);
    read(bmp_fd, &depth, 2);

    //3. 计算像素数组的大小(每行末尾填充字节，使得改行总字节数为4的倍数)
    int line_effctive_bytes = width * depth / 8; //一行有效字节数
    int line_full_bytes = 0; //保存每行的填充字节数
    if (line_effctive_bytes % 4 != 0) //一行有效字节数不是4的倍数
    {
        line_full_bytes = 4 - line_effctive_bytes % 4;
    }
    int line_total_bytes = line_effctive_bytes + line_full_bytes; //一行总字节数
    int total_bytes = line_total_bytes * height; //像素数组的总字节数

    //4. 偏移到第54个字节，读取自己计算这么多个字节
    char piexl_arr[total_bytes];
    lseek(bmp_fd, 54, SEEK_SET);
    read(bmp_fd, &piexl_arr, total_bytes); //读取想租数组中的图像数据，并解析得到一个一个像素点的color的颜色值

    //5. 解析读取到的像素数组的图像数据
    int i = 0;
    int b, g, r, a;
    int color;
    for(int y=0; y<height; y++) //循环遍历自己图片内的所有的(x,y)
    {
        for(int x=0; x<width; x++)
        {
            b = piexl_arr[i++];
            g = piexl_arr[i++];
            r = piexl_arr[i++];
            if (depth == 32)
            {
                a = piexl_arr[i++];
            }
            else if(depth == 24)
            {
                a = 0;
            }
            color = a<<24 | r<<16 | g<<8 | b;
            //6. 显示得到的像素点数据
            int x1 = x0 + x;
            int y1 = y0 + height - y - 1;
            *(plcd + 800*y1 + x1) = color;
        }

        i += line_full_bytes; //跳过每行末尾的填充字节数
    }

    //7. 关闭图片文件
    close(bmp_fd);
    return 0;
}